home *** CD-ROM | disk | FTP | other *** search
/ The Arsenal Files 8 / The Arsenal Files Collection #8 (Arsenal Computer) (1996).ISO / g_quake / dropde-2.zip / CHAIN.QC < prev    next >
Text File  |  1996-09-18  |  5KB  |  246 lines

  1.  
  2. /************\
  3. * BreakChain *
  4. \************/
  5.  
  6. void (entity Head) BreakChain =
  7. {
  8.     local entity link;
  9.  
  10.     link = Head.hook;
  11.     while (link != world)
  12.     {
  13.         Head = link.hook;
  14.         remove (link);
  15.         link = Head;
  16.     }
  17. };
  18.  
  19. /*********\
  20. * LinkPos *
  21. \*********/
  22.  
  23. void () LinkPos =
  24. {
  25.     makevectors (self.enemy.angles);
  26.     setorigin (self, self.owner.origin + ( ( ( self.enemy.origin + 
  27.         (v_up * 16 * (!self.enemy.button2)) + (v_forward * 16) ) - self.owner.origin ) *
  28.         ( self.weapon ) ) );
  29.     self.nextthink = time + 0.01;
  30. };
  31.  
  32. /***********\
  33. * MakeChain *
  34. \***********/
  35.  
  36. entity (entity head, entity tail, float num) MakeChain =
  37. {
  38.     local entity link, prevlink;
  39.     local float linknum;
  40.  
  41.     linknum = num;
  42.     num = num + 1;
  43.     prevlink = world;
  44.     while (linknum > 0)
  45.     {
  46.         link = spawn();
  47.  
  48.         link.hook = prevlink;
  49.         prevlink = link;
  50.  
  51.         link.owner = head;
  52.         link.enemy = tail;
  53.         link.weapon = linknum / num;
  54.         link.movetype = MOVETYPE_NOCLIP;
  55.         link.solid = SOLID_NOT;
  56.         link.angles_z = 51 * linknum;
  57.         link.angles_y = 41 * linknum;
  58.         link.angles_x = 31 * linknum;
  59.         link.avelocity = '310 410 510';
  60.         setmodel (link, "progs/bit.mdl");
  61.         setsize (link, '0 0 0', '0 0 0');
  62.         makevectors (tail.angles);
  63.         setorigin (link, head.origin + ( ( ( tail.origin 
  64.             + (v_up * 16 * (!tail.button2)) + ( v_forward * 16 ) ) - head.origin )
  65.             * ( link.weapon ) ) );
  66.         link.nextthink = time + 0.01;
  67.         link.think = LinkPos;
  68.         linknum = linknum - 1;
  69.     }
  70.     return link;
  71. };
  72.  
  73.  
  74. /************\
  75. * HookVanish *
  76. \************/
  77.  
  78. void () HookVanish =
  79. {
  80.     self.owner.hook = world;
  81. //    if (self.enemy.classname == "player")
  82. //        self.enemy.attack_finished = time + 0.1;
  83.     BreakChain (self);
  84.     remove (self);
  85. };
  86.  
  87. /**********\
  88. * HookPull *
  89. \**********/
  90.  
  91. void () HookPull =
  92. {
  93.     local vector vel, spray;
  94.     local float v;
  95.  
  96.     if ( ((!self.owner.button0) && self.owner.weapon == IT_MORNINGSTAR)
  97.             || self.owner.teleport_time > time || self.owner.deadflag )
  98.     {
  99. //        if (self.enemy.takedamage && self.weapon)
  100. //            self.enemy.nextthink = time + 0.1;
  101.         HookVanish();
  102.         return;
  103.     }
  104.     else
  105.     {
  106. /*
  107.         if (self.enemy.takedamage)
  108.         {
  109.             sound (self, CHAN_WEAPON, "blob/land1.wav", 1, ATTN_NORM);
  110.             T_Damage (self.enemy, self, self.owner, 1);
  111.             makevectors (self.v_angle);
  112.             spray_x = 100 * crandom();
  113.             spray_y = 100 * crandom();
  114.             spray_z = 100 * crandom() + 50;
  115.             SpawnBlood (self.origin, spray, 20);
  116.             if (self.weapon > 0)
  117.             {
  118.                 self.enemy.nextthink = time + 9999999;
  119.                 if (self.enemy.classname == "player")
  120.                     self.enemy.attack_finished = time + 9999999;
  121.             }
  122.             if (self.enemy.health <= 0)
  123.             {
  124.                 if (self.weapon > 0)
  125.                     self.enemy.nextthink = time + 0.1;
  126.             }
  127.             if (self.enemy.solid == SOLID_SLIDEBOX)
  128.             {
  129.                 self.velocity = '0 0 0';
  130.                 setorigin (self, self.enemy.origin
  131.                         + self.enemy.mins + (self.enemy.size * 0.5));
  132.             }
  133.             else
  134.                 self.velocity = self.enemy.velocity;
  135.         }
  136.         else
  137. */
  138.             self.velocity = self.enemy.velocity;
  139.         if (self.enemy.solid == SOLID_NOT)
  140.         {
  141.             HookVanish();
  142.             return;
  143.         }
  144.         makevectors (self.owner.angles);
  145.         vel = self.origin - ( self.owner.origin + (v_up * 16 *
  146.             (!self.owner.button2)) + (v_forward * 16));
  147.         v = vlen (vel);
  148.         if (v <= 100)
  149.             vel = normalize(vel) * v * 10;  
  150.         else
  151.             vel = normalize(vel) * 800;
  152.         self.owner.velocity = vel;
  153.         self.nextthink = time + 0.1;
  154.     }
  155. };
  156.  
  157. /**************\
  158. * T_ChainTouch *
  159. \**************/
  160.  
  161. void() T_ChainTouch =
  162. {
  163.     if (other == self.owner)
  164.         return;     // don't attach to owner
  165.  
  166.     if (pointcontents(self.origin) == CONTENT_SKY)
  167.     {
  168.         HookVanish();
  169.         return;
  170.     }
  171.  
  172.     if (other.takedamage)
  173.     {
  174.         sound (other, CHAN_BODY, "zombie/z_hit.wav", 1, ATTN_NORM);
  175.         T_Damage (other, self, self.owner, 10);
  176.         SpawnBlood (self.origin, self.velocity, 10);
  177.         HookVanish();  // Don't attach to "living" things!
  178.         return;
  179.     }
  180.     else
  181.     {
  182.         self.avelocity = '0 0 0';
  183.     }
  184.         
  185.     sound (self, CHAN_WEAPON, "weapons/bounce.wav", 1, ATTN_NORM);
  186.  
  187.     if (!self.owner.button0)
  188.     {
  189.         HookVanish();
  190.         return;
  191.     }
  192.     else
  193.     {
  194.         if (other.solid == SOLID_SLIDEBOX)
  195.         {
  196.             setorigin (self, other.origin + other.mins + (other.size * 0.5));
  197.             self.velocity = '0 0 0';
  198.         }
  199.         else
  200.         {
  201.             self.velocity = other.velocity;
  202.         }
  203.         self.weapon = other.nextthink - time;
  204.         self.enemy = other;
  205.         self.nextthink = time + 0.1;
  206.         self.think = HookPull;
  207.         self.touch = SUB_Null;
  208.     }
  209. };
  210.  
  211. /*************\
  212. * W_FireChain *
  213. \*************/
  214.  
  215. void() W_FireChain =
  216. {
  217.     local entity ent;
  218.  
  219.     ent = spawn ();
  220.     ent.classname = "morningstar";
  221.     ent.owner = self;
  222.     self.hook = ent;
  223.     ent.movetype = MOVETYPE_FLY;
  224.     ent.solid = SOLID_BBOX;
  225.         
  226. // set hook speed 
  227.  
  228.     makevectors (self.v_angle);
  229.     ent.velocity = aim(self, 800);
  230.     ent.velocity = ent.velocity * 800;
  231.     ent.angles = vectoangles(ent.velocity);
  232.     ent.avelocity = '0 0 -500';
  233.     
  234.     ent.touch = T_ChainTouch;
  235.     
  236. // set hook sound
  237.     ent.nextthink = time + 5;
  238.     ent.think = HookVanish;
  239.  
  240.     setmodel (ent, "progs/star.mdl");
  241.     setsize (ent, '0 0 0', '0 0 0');     
  242.     setorigin (ent, self.origin + (v_forward*16) + '0 0 16' );
  243.  
  244.     ent.hook = MakeChain (ent, self, 8);
  245. };
  246.